package cn.good.yan.t5;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;

import java.io.InputStream;

/**
 * 5。Resources 资源操作
 *    Resources接口, 全包名：org.springframework.core.io.Resource
 *    常用方法：
 *        boolean exists()：检查资源是否存在。
 *        boolean isReadable()：检查资源是否可读。
 *        boolean isOpen()：检查资源是否打开。
 *        URL getURL()：获取资源的URL。
 *        URI getURI()：获取资源的URI。
 *        File getFile()：获取资源对应的文件。
 *        long contentLength()：获取资源的长度。
 *        long lastModified()：获取资源的最后修改时间。
 *        Resource createRelative(String relativePath)：创建相对于当前资源的相对资源。
 *        String getFilename()：获取资源的文件名。
 *        String getDescription()：获取资源的描述信息。
 *        InputStream getInputStream()：获取资源的输入流。
 * @author shengren.yan
 * @create 2023-09-12
 */
public class Test {

    public static void main(String[] args) throws Exception{
        // 测试 1 - 访问网络资源
//        t1("https://www.baidu.com/");
//        t1("file:D:\\ate.txt");

        // 测试 2 - 访问网络资源 - 获取 resources 下的目录文件
//        t2("ate.txt");

            // 创建Spring应用上下文，从类路径中加载配置文件
        t4();
    }


    /**
     * 演示1 - 通过URL对象或String类型的URL路径进行实例化，用来访问网络资源
     * @param path  地址
     */
    public static void t1(String path) {
        // 创建一个 Resource 对象
        UrlResource url = null;
        try {
            url = new UrlResource(path);
            // 获取资源名
            System.out.println("获取资源的文件名: " + url.getFilename());
            System.out.println("获取资源的URI:" + url.getURI());
            // 获取资源描述
            System.out.println("获取资源的描述信息:" + url.getDescription());
            //获取资源内容
            System.out.println(url.getInputStream().read());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 演示2 - 类路径下的资源,  获取 resources 下的目录文件
     * @param path  地址
     */
    public static void t2(String path) throws Exception {
        // 创建一个 Resource 对象
        ClassPathResource resource = new ClassPathResource(path);
        // 获取文件名
        System.out.println("获取文件名 = " + resource.getFilename());
        // 获取文件描述
        System.out.println("获取文件描述 = "+ resource.getDescription());
        // 获取文件内容
        InputStream in = resource.getInputStream();
        byte[] b = new byte[1024];
        while (in.read(b) != -1) {
            System.out.println(new String(b));
        }
    }

    /**
     * 演示3 - FileSystemResource, 访问文件系统资源, 与  File 类 一样
     */
    public static void t3() throws Exception{
        // 相对路径
        FileSystemResource resource = new FileSystemResource("ate.txt");
        // 绝对路径
        //FileSystemResource resource = new FileSystemResource("D:\\ate.txt");
        // 获取文件名
        System.out.println("获取文件名 = " + resource.getFilename());
        // 获取文件描述
        System.out.println("获取文件描述 = "+ resource.getDescription());
        // 获取文件内容
        InputStream in = resource.getInputStream();
        byte[] b = new byte[1024];
        while(in.read(b)!=-1) {
            System.out.println(new String(b));
        }
    }

    /**
     * 演示4 创建Spring应用上下文，指定文件系统路径加载配置文件
     */
    private static void t4() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext();
        //   通过ApplicationContext访问资源
        //   ApplicationContext实例获取Resource实例时，
        //   默认采用与ApplicationContext相同的资源访问策略
        Resource res = ctx.getResource("ate.txt");
        System.out.println(res.getFilename());

        // 创建一个ApplicationContext容器对象，该对象会读取classpath（类路径）下的名为applicationContext.xml的配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 使用 classpath: 前缀指定使用 ClassPathResource 实现类
        Resource resource1 = context.getResource("classpath:config.properties");
        System.out.println("Resource 1: " + resource1.getClass().getSimpleName());
        // 使用 file: 前缀指定使用 FileSystemResource 实现类
        Resource resource2 = context.getResource("file:/path/to/file.txt");
        System.out.println("Resource 2: " + resource2.getClass().getSimpleName());
        // 使用 http: 前缀指定使用 UrlResource 实现类
        Resource resource3 = context.getResource("http://www.example.com");
        System.out.println("Resource 3: " + resource3.getClass().getSimpleName());
    }

}
